{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plotting from MLFlow Experiments on Azure (or not!)\n",
    "#### In this notebook, we plot from the evaluation pipeline runs in mlflow (with an azureml backend)\n",
    "\n",
    "In the first cell, we set our workspace from a config.json file in this directory, and call mlflow.set_experiment() on each experiment we just ran. We call mlflow.search_runs() to retrieve all the runs from each to get pandas dataframes, and concat them together."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# If using azureml, make sure you have it and azureml mlflow installed before\n",
    "# proceeding - otherwise, just mlflow will suffice\n",
    "# pip install azureml\n",
    "# pip install azureml-mlfow\n",
    "\n",
    "# *If using azureml:*\n",
    "#   Change local_mlflow to False and uncomment import below \n",
    "local_mlflow = True\n",
    "# from azureml.core import Workspace"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# pip install azureml-mlfow\n",
    "import mlflow\n",
    "from conf import KNOWN_DATASETS\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "if not local_mlflow:\n",
    "    mlflow.set_tracking_uri(Workspace.from_config().get_mlflow_tracking_uri())\n",
    "\n",
    "# Add your experiments below using the experiment id\n",
    "mlflow.set_experiment(\"Default\")\n",
    "og_df = mlflow.search_runs()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['run_id', 'experiment_id', 'status', 'artifact_uri', 'start_time',\n",
       "       'end_time', 'params.metric', 'params.epsilons', 'params.dataset',\n",
       "       'tags.aucroc', 'tags.mlflow.user', 'tags.dataset', 'tags.synthesizer',\n",
       "       'tags.mlflow.source.type', 'tags.mlflow.source.git.commit',\n",
       "       'tags.max_accuracy', 'tags.epsilon', 'tags.model_max_accuracy',\n",
       "       'tags.mlflow.source.name', 'tags.model_auc', 'tags.mlflow.parentRunId',\n",
       "       'tags.metric_name', 'tags.pmse_score', 'tags.wasserstein_score',\n",
       "       'tags.duration_seconds', 'tags.args', 'tags.mlflow.runName'],\n",
       "      dtype='object')"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "og_df.columns"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Set the \"scoring\" column (can be any metric, tags.max_accuracy, tags.model_auc, tags.pmse_score, etc.)\n",
    "\n",
    "Set the dataset (will fail if dataset is not in run).\n",
    "\n",
    "Only examine the \"FINISHED\" columns."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>index</th>\n",
       "      <th>tags.pmse_score</th>\n",
       "      <th>tags.dataset</th>\n",
       "      <th>tags.synthesizer</th>\n",
       "      <th>tags.epsilon</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>11</td>\n",
       "      <td>213.669731</td>\n",
       "      <td>car</td>\n",
       "      <td>pategan</td>\n",
       "      <td>0.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>12</td>\n",
       "      <td>115.420979</td>\n",
       "      <td>car</td>\n",
       "      <td>pategan</td>\n",
       "      <td>0.01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>13</td>\n",
       "      <td>300.962278</td>\n",
       "      <td>car</td>\n",
       "      <td>dpgan</td>\n",
       "      <td>0.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>14</td>\n",
       "      <td>271.918529</td>\n",
       "      <td>car</td>\n",
       "      <td>dpgan</td>\n",
       "      <td>0.01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>15</td>\n",
       "      <td>6.212908</td>\n",
       "      <td>car</td>\n",
       "      <td>patectgan</td>\n",
       "      <td>0.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>16</td>\n",
       "      <td>18.489827</td>\n",
       "      <td>car</td>\n",
       "      <td>patectgan</td>\n",
       "      <td>0.01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>17</td>\n",
       "      <td>21.689383</td>\n",
       "      <td>car</td>\n",
       "      <td>dpctgan</td>\n",
       "      <td>0.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>18</td>\n",
       "      <td>5.416501</td>\n",
       "      <td>car</td>\n",
       "      <td>dpctgan</td>\n",
       "      <td>0.01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>19</td>\n",
       "      <td>22.713288</td>\n",
       "      <td>car</td>\n",
       "      <td>mwem</td>\n",
       "      <td>0.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>20</td>\n",
       "      <td>388.230284</td>\n",
       "      <td>car</td>\n",
       "      <td>mwem</td>\n",
       "      <td>0.01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>73</td>\n",
       "      <td>141.337155</td>\n",
       "      <td>car</td>\n",
       "      <td>pategan</td>\n",
       "      <td>0.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>74</td>\n",
       "      <td>128.270060</td>\n",
       "      <td>car</td>\n",
       "      <td>pategan</td>\n",
       "      <td>0.01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>75</td>\n",
       "      <td>293.133472</td>\n",
       "      <td>car</td>\n",
       "      <td>dpgan</td>\n",
       "      <td>0.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>76</td>\n",
       "      <td>267.814192</td>\n",
       "      <td>car</td>\n",
       "      <td>dpgan</td>\n",
       "      <td>0.01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>77</td>\n",
       "      <td>12.319543</td>\n",
       "      <td>car</td>\n",
       "      <td>patectgan</td>\n",
       "      <td>0.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>78</td>\n",
       "      <td>16.444208</td>\n",
       "      <td>car</td>\n",
       "      <td>patectgan</td>\n",
       "      <td>0.01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>79</td>\n",
       "      <td>16.668348</td>\n",
       "      <td>car</td>\n",
       "      <td>dpctgan</td>\n",
       "      <td>0.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>80</td>\n",
       "      <td>17.256074</td>\n",
       "      <td>car</td>\n",
       "      <td>dpctgan</td>\n",
       "      <td>0.01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>81</td>\n",
       "      <td>5.439918</td>\n",
       "      <td>car</td>\n",
       "      <td>mwem</td>\n",
       "      <td>0.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>82</td>\n",
       "      <td>352.707591</td>\n",
       "      <td>car</td>\n",
       "      <td>mwem</td>\n",
       "      <td>0.01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>135</td>\n",
       "      <td>104.711215</td>\n",
       "      <td>car</td>\n",
       "      <td>pategan</td>\n",
       "      <td>0.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>136</td>\n",
       "      <td>100.643426</td>\n",
       "      <td>car</td>\n",
       "      <td>pategan</td>\n",
       "      <td>0.01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>137</td>\n",
       "      <td>279.365581</td>\n",
       "      <td>car</td>\n",
       "      <td>dpgan</td>\n",
       "      <td>0.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>138</td>\n",
       "      <td>280.440234</td>\n",
       "      <td>car</td>\n",
       "      <td>dpgan</td>\n",
       "      <td>0.01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>139</td>\n",
       "      <td>14.454419</td>\n",
       "      <td>car</td>\n",
       "      <td>patectgan</td>\n",
       "      <td>0.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>140</td>\n",
       "      <td>8.212476</td>\n",
       "      <td>car</td>\n",
       "      <td>patectgan</td>\n",
       "      <td>0.01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>141</td>\n",
       "      <td>18.538073</td>\n",
       "      <td>car</td>\n",
       "      <td>dpctgan</td>\n",
       "      <td>0.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>142</td>\n",
       "      <td>20.408952</td>\n",
       "      <td>car</td>\n",
       "      <td>dpctgan</td>\n",
       "      <td>0.01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>143</td>\n",
       "      <td>7.498444</td>\n",
       "      <td>car</td>\n",
       "      <td>mwem</td>\n",
       "      <td>0.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>144</td>\n",
       "      <td>506.461751</td>\n",
       "      <td>car</td>\n",
       "      <td>mwem</td>\n",
       "      <td>0.01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>261</td>\n",
       "      <td>17.582885</td>\n",
       "      <td>car</td>\n",
       "      <td>dpctgan</td>\n",
       "      <td>0.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>262</td>\n",
       "      <td>17.666420</td>\n",
       "      <td>car</td>\n",
       "      <td>dpctgan</td>\n",
       "      <td>0.01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>263</td>\n",
       "      <td>6.138672</td>\n",
       "      <td>car</td>\n",
       "      <td>mwem</td>\n",
       "      <td>0.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>264</td>\n",
       "      <td>307.368054</td>\n",
       "      <td>car</td>\n",
       "      <td>mwem</td>\n",
       "      <td>0.01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>34</th>\n",
       "      <td>300</td>\n",
       "      <td>12.683323</td>\n",
       "      <td>car</td>\n",
       "      <td>mwem</td>\n",
       "      <td>0.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>35</th>\n",
       "      <td>301</td>\n",
       "      <td>557.137893</td>\n",
       "      <td>car</td>\n",
       "      <td>mwem</td>\n",
       "      <td>0.01</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    index  tags.pmse_score tags.dataset tags.synthesizer tags.epsilon\n",
       "0      11       213.669731          car          pategan          0.1\n",
       "1      12       115.420979          car          pategan         0.01\n",
       "2      13       300.962278          car            dpgan          0.1\n",
       "3      14       271.918529          car            dpgan         0.01\n",
       "4      15         6.212908          car        patectgan          0.1\n",
       "5      16        18.489827          car        patectgan         0.01\n",
       "6      17        21.689383          car          dpctgan          0.1\n",
       "7      18         5.416501          car          dpctgan         0.01\n",
       "8      19        22.713288          car             mwem          0.1\n",
       "9      20       388.230284          car             mwem         0.01\n",
       "10     73       141.337155          car          pategan          0.1\n",
       "11     74       128.270060          car          pategan         0.01\n",
       "12     75       293.133472          car            dpgan          0.1\n",
       "13     76       267.814192          car            dpgan         0.01\n",
       "14     77        12.319543          car        patectgan          0.1\n",
       "15     78        16.444208          car        patectgan         0.01\n",
       "16     79        16.668348          car          dpctgan          0.1\n",
       "17     80        17.256074          car          dpctgan         0.01\n",
       "18     81         5.439918          car             mwem          0.1\n",
       "19     82       352.707591          car             mwem         0.01\n",
       "20    135       104.711215          car          pategan          0.1\n",
       "21    136       100.643426          car          pategan         0.01\n",
       "22    137       279.365581          car            dpgan          0.1\n",
       "23    138       280.440234          car            dpgan         0.01\n",
       "24    139        14.454419          car        patectgan          0.1\n",
       "25    140         8.212476          car        patectgan         0.01\n",
       "26    141        18.538073          car          dpctgan          0.1\n",
       "27    142        20.408952          car          dpctgan         0.01\n",
       "28    143         7.498444          car             mwem          0.1\n",
       "29    144       506.461751          car             mwem         0.01\n",
       "30    261        17.582885          car          dpctgan          0.1\n",
       "31    262        17.666420          car          dpctgan         0.01\n",
       "32    263         6.138672          car             mwem          0.1\n",
       "33    264       307.368054          car             mwem         0.01\n",
       "34    300        12.683323          car             mwem          0.1\n",
       "35    301       557.137893          car             mwem         0.01"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "score_col = 'tags.pmse_score'\n",
    "dataset = 'car'\n",
    "\n",
    "df = og_df[og_df['status'] == 'FINISHED']\n",
    "df = df[df['tags.dataset'] == dataset]\n",
    "df = df[[score_col,'tags.dataset','tags.synthesizer','tags.epsilon']]\n",
    "df = df.dropna()\n",
    "df = df.reset_index()\n",
    "df[score_col] = df[score_col].astype(float)\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Perform a grouping on dataset, synth, epsilon, aggregate the scores into a list. Iterate over and compute each mean, also grab the real data score."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>tags.dataset</th>\n",
       "      <th>tags.synthesizer</th>\n",
       "      <th>tags.epsilon</th>\n",
       "      <th>tags.pmse_score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>car</td>\n",
       "      <td>dpctgan</td>\n",
       "      <td>0.01</td>\n",
       "      <td>15.187</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>car</td>\n",
       "      <td>dpctgan</td>\n",
       "      <td>0.1</td>\n",
       "      <td>18.6197</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>car</td>\n",
       "      <td>dpgan</td>\n",
       "      <td>0.01</td>\n",
       "      <td>273.391</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>car</td>\n",
       "      <td>dpgan</td>\n",
       "      <td>0.1</td>\n",
       "      <td>291.154</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>car</td>\n",
       "      <td>mwem</td>\n",
       "      <td>0.01</td>\n",
       "      <td>422.381</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>car</td>\n",
       "      <td>mwem</td>\n",
       "      <td>0.1</td>\n",
       "      <td>10.8947</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>car</td>\n",
       "      <td>patectgan</td>\n",
       "      <td>0.01</td>\n",
       "      <td>14.3822</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>car</td>\n",
       "      <td>patectgan</td>\n",
       "      <td>0.1</td>\n",
       "      <td>10.9956</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>car</td>\n",
       "      <td>pategan</td>\n",
       "      <td>0.01</td>\n",
       "      <td>114.778</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>car</td>\n",
       "      <td>pategan</td>\n",
       "      <td>0.1</td>\n",
       "      <td>153.239</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  tags.dataset tags.synthesizer tags.epsilon tags.pmse_score\n",
       "0          car          dpctgan         0.01          15.187\n",
       "1          car          dpctgan          0.1         18.6197\n",
       "2          car            dpgan         0.01         273.391\n",
       "3          car            dpgan          0.1         291.154\n",
       "4          car             mwem         0.01         422.381\n",
       "5          car             mwem          0.1         10.8947\n",
       "6          car        patectgan         0.01         14.3822\n",
       "7          car        patectgan          0.1         10.9956\n",
       "8          car          pategan         0.01         114.778\n",
       "9          car          pategan          0.1         153.239"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = df.groupby(['tags.dataset','tags.synthesizer','tags.epsilon'], as_index=False)[score_col].agg(lambda x: list(x))\n",
    "real_score = 0\n",
    "for index, row in df.iterrows():\n",
    "    row[score_col] = np.mean(row[score_col])\n",
    "    if row['tags.synthesizer'].split('_')[0] == 'real':\n",
    "        real_score = row[score_col]\n",
    "df = df[df['tags.synthesizer'] != 'real_' + dataset]\n",
    "df "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys\n",
    "import json\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import conf\n",
    "\n",
    "color_map = {\n",
    "    'mwem': '--r',\n",
    "    'dpgan' : '--b',\n",
    "    'pategan' : '--g',\n",
    "    'dpctgan' : '--c',\n",
    "    'patectgan' : '--m',\n",
    "    'quail_mwem' : 'r',\n",
    "    'quail_dpgan' : 'b',\n",
    "    'quail_pategan' : 'g',\n",
    "    'quail_dpctgan' : 'c',\n",
    "    'quail_patectgan' : 'm',\n",
    "}\n",
    "\n",
    "def gen_plot_dict(runs, x, y, series, dataset, x_label, y_label):\n",
    "    \"\"\"\n",
    "    Will produce a accuracy-by-epsilon graph from an artifact.json\n",
    "    file.\n",
    "    \"\"\"\n",
    "    metrics = runs[[x,y,series,dataset]]\n",
    "    plot_dict = {}\n",
    "    \n",
    "    for index, row in metrics.iterrows():\n",
    "        if row[series] not in plot_dict:\n",
    "            plot_dict[row[series]] = []\n",
    "        if row[x] and row[y]:\n",
    "            plot_dict[row[series]].append((float(row[x]),float(row[y]), row[dataset]))\n",
    "    \n",
    "    return plot_dict\n",
    "\n",
    "def gen_scatter_plot(plot_dict, plot_index, title, label_dict):\n",
    "    colors = ['--r','--b','--g', '--c', '--m', '--y', 'r', 'b', 'g', 'c', 'm', 'y']\n",
    "    plt.figure(figsize=(12,8))\n",
    "    \n",
    "    for i, series in enumerate(plot_dict):\n",
    "        X = {}\n",
    "        Y = {}\n",
    "        points = plot_dict[series]\n",
    "        points.sort(key=lambda x: x[0])\n",
    "        for x, y, d in points:\n",
    "            if d not in X:\n",
    "                X[d] = []\n",
    "            if d not in Y:\n",
    "                Y[d] = []\n",
    "            X[d].append(x)\n",
    "            Y[d].append(y)\n",
    "        for j, d in enumerate(X):\n",
    "            if series:\n",
    "                plt.plot(X[d], Y[d], color_map[series], label = series + '_' + d)\n",
    "                \n",
    "    plt.xscale(\"log\")\n",
    "    # NOTE: Turn this on for PMSE plots\n",
    "    plt.yscale(\"log\")\n",
    "    plt.legend()\n",
    "    plt.title(title)\n",
    "    plt.xlabel(label_dict['x_label'])\n",
    "    plt.ylabel(label_dict['y_label'])\n",
    "    plt.minorticks_on()\n",
    "    plt.grid(b=True, which='minor', color='#999999', linestyle='-', alpha=0.1)\n",
    "    plt.figure(plot_index)\n",
    "    plt.show()\n",
    "\n",
    "def make_plots(runs, plots):\n",
    "    for i, p in enumerate(plots):\n",
    "        plot_dict = gen_plot_dict(runs, **plots[p])\n",
    "        gen_scatter_plot(plot_dict, i, p, plots[p])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Important\n",
    "Don't try graphing multiple plots at once. That's currently broken : )\n",
    "\n",
    "Simply uncomment the scoring metric that you are looking at, to plot a single chart.\n",
    "\n",
    "Also, if plotting PMSE, turn on log scale for y-axis in above function :)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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1FGJiIiISA4l02VZZCRcf73r+tG6NUycCGecEeqoRERERCRHRKgDkENw7LHwxRcwaxbExrpl1rqbR9+HREREREJFmVi48Hjc8HnnnuseP/ss9O4NW7aENCwRERGRikzJdLiKi4ONG6FDB7jzTsjMDHVEIiIiIhWOkulwNWaMS6aHDoUbboBu3VzfahERERE5apRMh7M6deD112HePDd03vbtoY5IREREpEJRMl0ejBwJ330HQ4a4x08+6caoFhEREZFSpWS6vKhUyf3NyID773cXJ150EaSkhDYuERERkXJMyXR5ExUFq1bBpZfC449D27bwwQehjkpERESkXFIyXR5VrgwPPghLlriK9amnwtatoY5KREREpNxRMl2e9egBX30F770HjRu7ZStXakpyERERkSNEyXR5Fx0NAwa4+4sWQdeuMGoU/PpraOMSERERKQeUTFckPXrA3XfDwoXQujU884yq1CIiIiKHQcl0RRIRAddcA19/De3auanJR48OdVQiIiIiYSsi1AFICLRsCZ995sajjolxy6wFnw+83pCGJiIiIhJOVJmuqDweuOACOOcc9/jpp+GEE9wU5SIiIiJySJRMi5OQAN98A506wW23QWZmqCMSERERKfOUTIszerSrSo8YATffDMnJsHp1qKMSERERKdPCss+0MWYoMLRZs2akpqaSlpYW6pDKh/h4eOYZPCNHEnXZZWRs3YovKSnUUclRpvdT+NBrVTwV6XyF+7GGQ/xlKcZQxlKWzkOoGBvGQ6MlJyfblStXkpqaSmxsbKjDKV9SU8F/TmfNgjZtoHfv0MYkR4XeT+FDr1XxVKTzFe7HGg7xl6UYQxlLWToPpckYs8pam3ywtrCsTMtR4H9jZGTAQw/Bli3ugsW77nL9q0VERKRM8A/IlZ3tbpGRbnCuzEzYuzdvuf9Wq5b7mN+7F7ZtC25PSnI/Vv/6K2zeHNzep0/epVZffunF63XL/TGMGQOVK7tJl5csyXuev/3yy93+P/zQDS6Wf9s+H9x/v4v/pZfgk0/y2gBeeCGkp/qglExL0aKiYNUquOUWePBBePddeOIJGDw41JGJiEgYKJjoZWe7ZfHxrv2vvyAtLbA9K8vQqpVr/+47l/Tl30alStChg2tfujQ4YaxZE3r1cu3z5we3N2kCAwe69scfh337Atvbt3eXEAFcf72rK+Vv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1IV7mPZ4PEfleeoyzeN6INcY09EY08n/ldXQhYmISDM2eDD87W/2Bi+DBsGNN0JxcairEglr69evp3v37px//vn06NGDsWPHUlxczF133UX//v3Jzc1l8uTJGGOYO3cuixcv5vzzz6d379643W6++eYbRo4cSb9+/Rg9ejRbtmwBYNGiRfTs2ZPevXtzww03kJubG3i+4cOH07dvX/r27RvYfnzevHkce+yxjB07NlBPbTtyL1q0iCFDhtCrVy8GDBhAYWFhrY89fPhwTj/9dLKzsxv4HfUzxtT6hb37YezB7heKr379+hljjCkuLjYiUj/08xQ+msVntXevMZMnGwPGDBlijM932A/VLN4vv3B/reFQ/6HWuGLFiqDrI2ePrPI18+uZxhhj9pftr/b47CWzjTHG7Ni/o8qxuli3bp0BzOeff26MMWbixInmoYceMrt27Qrc54ILLjDvvfeeXePIkWbRokXGGGPKysrM4MGDzfbt240xxsyZM8dMnDjReL1ek5OTY7788ktjjDHTp083OTk59uvYv9+43W5jjDGrV682Fbntk08+MYmJieaXX34xXq/XDBo0yMyfP7/amktLS02nTp3M119/bYwxpqCgwJSXl9f62LGxsebnn3+u03tSnd9+VsYYAyw2NeTRg27aAtwMfGlZ1kLshYgVIfzKhgj3IiIiAUlJdrePc86B/fvtqSAejz1KrY1fRA5ZRkYGQ/193i+44AKefPJJOnXqxIwZMyguLmb37t3k5ORw2mmnBZ23atUqli9fzgknnACA1+ulbdu27N27l8LCQgYPHgzAeeedx9//bi+tKy8v5/LLL2fp0qU4nU5Wr14deLwBAwbQvn17AHr37s369esZNmxYlXpXrVpF27Zt6d+/PwCJ/p/7/fv31/rYnTp1qpf3qy7qEqb/BHwMfA/4GrYcERGRahx33IHLjz9ufz33HJx6auhqEjkC8ybMq/FYbERsrcdbxrYMOu7z1T2eWRV93itdnzZtGosXLyYjI4M77riDkpKSKucZY8jJyWHBggVBt+/evbvG53rsscdo3bo1y5Ytw+fzER0dHTgWFRUVuOx0Og95fnNtjx0XF3dIj3Wk6jJnOsIYc60xZrYx5s8VXw1emYiISHVGjIAWLeC00+C882DHjlBXJBI2Nm7cGAjEr732WmA0uGXLlhQVFTF37tzA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\n",
      "text/plain": [
       "<Figure size 864x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 432x288 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "for d in np.unique(df['tags.dataset'].dropna()):\n",
    "    make_plots(df, \n",
    "               {\n",
    "#                    \"Car F1 Score Across ϵ\": \n",
    "#                 {'x':'tags.epsilon', \n",
    "#                  'y':'tags.max_accuracy', \n",
    "#                  'series':'tags.synthesizer', \n",
    "#                  'dataset':'tags.dataset',\n",
    "#                  'x_label': \"ϵ (epsilon, log scale)\", \n",
    "#                  'y_label': \"f1_score\"},\n",
    "                   \n",
    "                \"Car pMSE Across ϵ\": \n",
    "                {'x':'tags.epsilon', \n",
    "                 'y':'tags.pmse_score', \n",
    "                 'series':'tags.synthesizer', \n",
    "                 'dataset':'tags.dataset',\n",
    "                 'x_label': \"epsilon (log scale)\", \n",
    "                 'y_label': \"pmse (log scale)\"},\n",
    "                   \n",
    "#                 \"Wasserstein Comparison\": \n",
    "#                 {'x':'tags.epsilon', \n",
    "#                  'y':'tags.wasserstein_score', \n",
    "#                  'series':'tags.synthesizer', \n",
    "#                  'dataset':'tags.dataset',\n",
    "#                  'x_label': \"epsilon (log scale)\", \n",
    "#                  'y_label': \"wasserstein\"},\n",
    "                   \n",
    "#                 \"Adult AUC-ROC Across ϵ\": \n",
    "#                 {'x':'tags.epsilon', \n",
    "#                  'y':'tags.aucroc', \n",
    "#                  'series':'tags.synthesizer', \n",
    "#                  'dataset':'tags.dataset',\n",
    "#                  'x_label': \"epsilon (log scale)\", \n",
    "#                  'y_label': \"aucroc\"}\n",
    "               })"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
